﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DAO
{
    public class DAOUsuario
    {
        public static List<Entidad.EntidadUsuario> getTodas()
        {
            List<Entidad.EntidadUsuario> lista = new List<Entidad.EntidadUsuario>();
            AccesoDato ad = new AccesoDato();
            try
            {
                String sql = "Select * from usuario";
                SqlDataReader dr = ad.ejecutarSql(sql, null);

                while (dr.Read())
                {
                    Entidad.EntidadUsuario e = new Entidad.EntidadUsuario();
                    e.id_usuario = int.Parse(dr["id_usuario"].ToString());
                    e.usuario = dr["usuario"].ToString();
                    e.clave = dr["clave"].ToString();
                    e.id_rol = int.Parse(dr["id_rol"].ToString());
                    lista.Add(e);
                }
            }
            catch (ApplicationException)
            {
                throw new ApplicationException("Error al obtener todos los usuarios");
            }
            finally
            {
                ad.cerrarDR();
            }

            return lista;
        }

        public static Entidad.EntidadUsuario getUsuario(string usuario)
        {
            Entidad.EntidadUsuario e = new Entidad.EntidadUsuario();
            AccesoDato ad = new AccesoDato();
            try
            {
                String sql = "Select * from usuario where usuario = @usuario";
                List<SqlParameter> p = new List<SqlParameter>();
                p.Add(new SqlParameter("@usuario", usuario));
                SqlDataReader dr = ad.ejecutarSql(sql, p);

                while (dr.Read())
                {
                    e.id_usuario = int.Parse(dr["id_usuario"].ToString());
                    e.usuario = dr["usuario"].ToString();
                    e.clave = dr["clave"].ToString();
                    e.id_rol = int.Parse(dr["id_rol"].ToString());
                }
            }
            catch (ApplicationException)
            {
                throw new ApplicationException("Error al obtener el usuario");
            }
            finally
            {
                ad.cerrarDR();
            }

            return e;
        }

        public static string getRolUsuarioString(string usuario)
        {
            AccesoDato ad = new AccesoDato();
            string rol = null;
            try
            {
                String sql = @"Select rol.nombre 
                 from usuario
                 inner join rol on rol.id_rol = usuario.id_rol
                 where usuario = @usuario";
                List<SqlParameter> p = new List<SqlParameter>();
                p.Add(new SqlParameter("@usuario", usuario));
                SqlDataReader dr = ad.ejecutarSql(sql, p);

                while (dr.Read())
                {
                    rol = dr["nombre"].ToString();
                }
            }
            catch (ApplicationException)
            {
                throw new ApplicationException("Error al obtener el rol");
            }
            finally
            {
                ad.cerrarDR();
            }

            return rol;
        }

        public static int getIdUsuario(string usuario)
        {
            AccesoDato ad = new AccesoDato();
            int id_usuario = 0;
            try
            {
                String sql = @"Select id_usuario 
                 from usuario                
                 where usuario = @usuario";
                List<SqlParameter> p = new List<SqlParameter>();
                p.Add(new SqlParameter("@usuario", usuario));
                SqlDataReader dr = ad.ejecutarSql(sql, p);

                while (dr.Read())
                {
                    id_usuario = int.Parse(dr["id_usuario"].ToString());
                }
            }
            catch (ApplicationException)
            {
                throw new ApplicationException("Error al obtener el rol");
            }
            finally
            {
                ad.cerrarDR();
            }

            return id_usuario;
        }

        public static string getNombreUsuario(int id_usuario)
        {
            AccesoDato ad = new AccesoDato();
            string nombre_usuario = "";
            try
            {
                String sql = @"Select usuario
                 from usuario                
                 where id_usuario = @id_usuario";
                List<SqlParameter> p = new List<SqlParameter>();
                p.Add(new SqlParameter("@id_usuario", id_usuario));
                SqlDataReader dr = ad.ejecutarSql(sql, p);

                while (dr.Read())
                {
                    nombre_usuario = dr["usuario"].ToString();
                }
            }
            catch (ApplicationException)
            {
                throw new ApplicationException("Error al obtener el rol");
            }
            finally
            {
                ad.cerrarDR();
            }

            return nombre_usuario;
        }

        public static void Guardar(Entidad.EntidadUsuario usuario)
        {
            String sql = @"insert into usuario (usuario,clave,id_rol)
                                    values(@usuario,@clave,@id_rol)";
            AccesoDato ad = new AccesoDato();
            try
            {
                List<SqlParameter> p = new List<SqlParameter>();
                p.Add(new SqlParameter("@usuario", usuario.usuario));
                p.Add(new SqlParameter("@clave", usuario.clave));
                p.Add(new SqlParameter("@id_rol", usuario.id_rol));

                ad.ejecutarNonQuery(sql, p);
            }
            catch (ApplicationException)
            {
                throw new ApplicationException("Error al guardar el usuario");
            }
        }

        public static Boolean usuarioEnUso(string usuario)
        {
            Boolean flag = false;
            AccesoDato ad = new AccesoDato();
            try 
	        {	     
                string sql = "select * from usuario where usuario = @usuario";
                List<SqlParameter> p = new List<SqlParameter>();
                p.Add(new SqlParameter("usuario", usuario));
                SqlDataReader dr = ad.ejecutarSql(sql,p);

                while(dr.Read()){

                    flag = true;
                }
		
	        }
	        catch (ApplicationException)
	        {
		
		        throw new ApplicationException("Error al obtener el usuario") ;
	        }
            finally{

                ad.cerrarDR();
            }
            return flag;

       }

        public static void Actualizar(Entidad.EntidadUsuario usuario)
        {
            String sql = @"update usuario set usuario=@usuario,
                        clave=@clave,
                        id_rol=@id_rol
                        where id_usuario = @id_usuario";

            AccesoDato ad = new AccesoDato();
            try
            {
                List<SqlParameter> p = new List<SqlParameter>();
                p.Add(new SqlParameter("@id_usuario", usuario.id_usuario));
                p.Add(new SqlParameter("@usuario", usuario.usuario));
                p.Add(new SqlParameter("@clave", usuario.clave));
                p.Add(new SqlParameter("@id_rol", usuario.id_rol));
              
                ad.ejecutarNonQuery(sql, p);
            }
            catch (ApplicationException)
            {
                throw new ApplicationException("Error al actualizar el usuario");
            }
        }

        public static void Eliminar(int id_usuario)
        {
            String sql = "Delete from usuario where id_usuario = @id_usuario";
            AccesoDato ad = new AccesoDato();
            try
            {
                List<SqlParameter> p = new List<SqlParameter>();
                p.Add(new SqlParameter("id_usuario", id_usuario));
                ad.ejecutarNonQuery(sql, p);

            }
            catch (ApplicationException)
            {
                
                throw new ApplicationException("Error al eliminar el usuario.");
            }
            finally
            {
                ad.cerrarDR();
            }
        }
    }

}
